/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/* $Id$ */

package org.apache.fop.render.mif;

// Java
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

/**
 * The MIF File.
 * This organises the MIF File and the corresponding elements.
 * The catalog elements are used to setup the resources that
 * are referenced.
 */
public class MIFFile extends MIFElement {

    /** colorCatalog */
    protected MIFElement colorCatalog;
    /** pgfCatalog */
    protected PGFElement pgfCatalog;
    /** fontCatalog */
    protected MIFElement fontCatalog;
    /** rulingCatalog */
    protected RulingElement rulingCatalog;
    /** tblCatalog */
    protected MIFElement tblCatalog;
    /** views */
    protected MIFElement views;
    /** variableFormats */
    protected MIFElement variableFormats;
    /** xRefFormats */
    protected MIFElement xRefFormats;
    /** document */
    protected MIFElement document;
    /** bookComponent */
    protected MIFElement bookComponent;
    /** initialAutoNums */
    protected MIFElement initialAutoNums;
    /** aFrames */
    protected MIFElement aFrames;
    /** tbls */
    protected MIFElement tbls;
    /** pages */
    protected List pages = new java.util.ArrayList();
    /** textFlows */
    protected List textFlows;


    /** default constructor */
    public MIFFile() {
        super("");
        valueElements = new java.util.ArrayList();
        setup();
    }

    /**
     * Do some setup.
     * Currently adds some dummy values to the resources.
     */
    protected void setup() {
        MIFElement unit = new MIFElement("Units");
        unit.setValue("Ucm");
        addElement(unit);

        colorCatalog = new MIFElement("ColorCatalog");
        MIFElement color = new MIFElement("Color");
        MIFElement prop = new MIFElement("ColorTag");
        prop.setValue("`Black'");
        color.addElement(prop);
        prop = new MIFElement("ColorCyan");
        prop.setValue("0.000000");
        color.addElement(prop);

        prop = new MIFElement("ColorMagenta");
        prop.setValue("0.000000");
        color.addElement(prop);
        prop = new MIFElement("ColorYellow");
        prop.setValue("0.000000");
        color.addElement(prop);
        prop = new MIFElement("ColorBlack");
        prop.setValue("100.000000");
        color.addElement(prop);
        prop = new MIFElement("ColorAttribute");
        prop.setValue("ColorIsBlack");
        color.addElement(prop);
        prop = new MIFElement("ColorAttribute");
        prop.setValue("ColorIsReserved");
        color.addElement(prop);
        color.finish(true);

        colorCatalog.addElement(color);
        addElement(colorCatalog);

        pgfCatalog = new PGFElement();
        pgfCatalog.lookupElement(null);
        addElement(pgfCatalog);

        rulingCatalog = new RulingElement();
        rulingCatalog.lookupElement(null);
        addElement(rulingCatalog);

    }

    /**
     * @param os output stream
     * @throws IOException if not caught
     */
    public void output(OutputStream os) throws IOException {
        if (finished) {
            return;
        }

        if (!started) {
            os.write(("<MIFFile  5.00> # Generated by FOP\n"/* + getVersion()*/).getBytes());
            started = true;
        }
        boolean done = true;

        for (Iterator iter = valueElements.iterator(); iter.hasNext();) {
            MIFElement el = (MIFElement)iter.next();
            boolean d = el.output(os, 0);
            if (d) {
                iter.remove();
            } else {
                done = false;
                break;
            }
        }
        if (done && finish) {
            os.write(("# end of MIFFile").getBytes());
        }
    }

    /** @param p a page element to add */
    public void addPage(MIFElement p) {
        pages.add(p);
        addElement(p);
    }
}

